package com.leyou.search.pojo;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 商品文档对象
 * 注意： 一个Spu对象对应一个Goods对象
 */
@Data
@Document(indexName = "goods",type = "docs",shards = 1 ,replicas = 1)
public class Goods {

    @Id
    private Long id; //spuId

    @Field(type = FieldType.Text,index = true,analyzer = "ik_max_word")
    private String spuName;//spu商品名称    该字段需要索引，需要分词，纯粹是为了高亮显示

    @Field(type = FieldType.Keyword,index = false)
    private String subTitle;//促销信息   该字段不需要索引，不需要分词

    @Field(type = FieldType.Text,index = true,analyzer = "ik_max_word")
    private String all;//该字段用于存放所有参与搜素的条件   spuName+subTitle+所有Sku的title...

    @Field(type = FieldType.Keyword,index = false)
    private String skus; // 该字段存储该Spu下的所有Sku列表，以json字符串存储。格式： [{"image":"xxx","price":20000}....  ]  该字段不需要索引，不需要分词

    @Field(type = FieldType.Long,index = true)
    private Long categoryId;//分类。代表当前商品的分类。 搜索条件上面的分类列表，其实通过所有分类聚合而来的
    @Field(type = FieldType.Long,index = true)
    private Long brandId;//品牌。代表当前商品的品牌。 搜索条件上面的品牌列表，其实通过所有品牌聚合而来的

    /**
     * 规格参数分为通用规格参数（属于Spu） 和 特有规格参数（属于Sku）
     *  通用规格参数：  只有一个值的 例如：上市年份
     *  特有规格参数:  可能有多个值  例如：机身颜色
     */
    @Field(type = FieldType.Object,index = true)
    private Map<String,Object> specs;//该字段存储该商品的所有搜索规格参数。 规格参数本来就要作为查询条件，所以可以索引

    @Field(type = FieldType.Long,index = true)
    private Long createTime;//商品的创建时间，该字段用于排序条件

    @Field(type = FieldType.Long,index = true)
    private Set<Long> price;//商品的价格，该字段用于排序条件
}
